feat: v1 declares memory; the audit argues with the spec's own claim (0.3.0) - #15
Merged
Merged
Conversation
…(0.3.0) Two holes named in #14's out-of-scope, closed. Neither needed a decision: the memory shape already existed in this repo, and comparing a claim against a computation is a tool feature, not vocabulary. ## agent-spec v1 declares memory A required block, per scope: name, purpose, retention, user_visible, user_editable, lawful_basis, plus a forget mechanism. The shape follows memory-policy.schema.yaml, so nothing was invented — it was ported. Required, not optional. An agent that keeps nothing writes `memory: { persistent: false }`, because silence and "none" are different claims and only one of them is checkable. Consequences: - aux.H08 is scoreable under v1, so the three memory gaps in the taxonomy (memory_amnesia, preference_ignored, context_leak) are reachable from a v1 spec again. A quarter of the taxonomy was out of reach. - aux.T02 Contextual Trust is assessable, so the ladder can pass it. - v1 says more than v0 could: whether each scope is bounded, and whether the user can have it forgotten. A retention period with no forget mechanism is a promise about the calendar, not a control the user holds. - Memory the user cannot see costs aux.H02; memory they cannot correct costs aux.H03. Same split v0 made, where user_editable fed H03. Caught by a test that expected H08 to punish a hidden ten-year scope and found the rule ignoring visibility entirely. ## The audit argues with the claim v1 specs may declare a trust_stage. It is never an input to the score. It is compared against it: The spec claims advocacy; the evidence supports no stage at all. A stage is earned by what the spec can show, not by what it says about itself. Claiming more than the evidence supports is a `high` finding naming what blocks it. Claiming less is surfaced next to the computed stage and nothing more — modesty is not a defect, and the reference example under-claims, which is now pinned by a test. 55 tests, up from 48. v0 scoring unchanged: 100/A/advocacy and 4/F, same evidence strings. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MhpqWEvwKp7NrmJfdXYq4M
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this PR does
Closes the two holes #14 left out of scope. On reflection neither needed a decision first: the memory shape already existed in this repo, and comparing a claim against a computation is a tool feature, not vocabulary.
1. agent-spec v1 declares memory
A required block, per scope:
name,purpose,retention,user_visible,user_editable,lawful_basis, plus aforgetmechanism. The shape followsmemory-policy.schema.yaml— ported, not invented.Required rather than optional. An agent that keeps nothing writes
memory: { persistent: false }, because silence and "none" are different claims and only one of them is checkable.What that fixes:
aux.H08is scoreable under v1, somemory_amnesia,preference_ignoredandcontext_leakare reachable from a v1 spec again. A quarter of the taxonomy was out of reach.aux.T02Contextual Trust is assessable, so the ladder can pass it.A bug this surfaced. I wrote a test expecting a hidden, uneditable, ten-year scope to score badly on
aux.H08— and it scored present, because my v1 rule read persistence and retention but ignored visibility and editability entirely. The fix is the split v0 already made: memory the user cannot see costsaux.H02, memory they cannot correct costsaux.H03, andaux.H08stays about whether the agent remembers usefully. The test now asserts that routing.2. The audit argues with the claim
A v1 spec may declare a
trust_stage. It is never an input to the score — it is compared against it:The finding names what blocks it: "the spec claims aux.T04 Advocacy Trust; the evidence supports no stage at all — blocked by aux.H06, aux.H10, aux.H05, aux.H07". Severity
high.Claiming less than the evidence supports is surfaced next to the computed stage and nothing more. Modesty is not a defect — and the reference example under-claims (
aux.T02while earning advocacy), which a test now pins.Linked Issue
Follows up #10 and #14. Nothing left open on either.
Type
Migration note:
memorybecomes a required field in agent-spec v1, which landed hours ago and has no specs written against it outside this repo, so the migration cost is the two fixtures updated here. No IDs introduced or renamed — the block reusesmemory-policy.schema.yaml's field names.schemas/MIGRATION.mddocuments it. v0.1.0 is untouched.aux-auditgoes to 0.3.0:aux.H02,aux.H03andaux.H08measure differently under v1 than in 0.2.0, so v1 scores are not comparable across that boundary. v0 scores are unchanged from 0.1.x.Contribution bar — checklist
debateIssue first. — none introduced or renamed.schemas/validate.pyPASSED,check-coverage.py12/12,yamllintclean,check:schemasclean, links resolve, v1 still validates as draft 2020-12.Deliberately not in this PR
Two items from #9's out-of-scope list stay open, and they are coupled: the incoming pattern catalogue for
trust-contract.yamluses the other fix-pattern vocabulary (dissent-surface,scope-boundary), so adopting it means renaming shipped pattern folders, their diagrams andcheck-coverage.py. Nothing in the repo is currently broken by this — the seven patterns are internally consistent — so it is an unexplored alternative rather than a defect, and it needs adebateIssue before anyone touches it.🤖 Generated with Claude Code
https://claude.ai/code/session_01MhpqWEvwKp7NrmJfdXYq4M
Generated by Claude Code